package XML与JSON.使用DOM;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class 创建XML文件 {

    public static void main(String[] args) throws ParserConfigurationException,TransformerException {

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.newDocument();
        
        //创建一个根元素，并使用appendChild()将其添加到文档中
        Element root = doc.createElementNS("XML与JSON.使用DOM", "users1");
        doc.appendChild(root);

        //将三个子元素附加到根元素
        root.appendChild(createUser(doc, "1", "Robert", "Brown", "programmer"));
        root.appendChild(createUser(doc, "2", "Pamela", "Kyle", "writer"));
        root.appendChild(createUser(doc, "3", "Peter", "Smith", "teacher"));

        //Java DOM 使用Transformer生成 XML 文件。 之所以称为转换器，是因为它也可以使用 XSLT 语言转换文档。 在我们的情况下，我们仅写入 XML 文件
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transf = transformerFactory.newTransformer();

        //设置文档的编码和缩进
        transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transf.setOutputProperty(OutputKeys.INDENT, "yes");
        transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

        //DOMSource保存 DOM 树
        DOMSource source = new DOMSource(doc);

        File myFile = new File("src\\main\\java\\XML与JSON\\使用DOM\\users1.xml");

        //将要写入控制台和文件。 StreamResult是转换结果的持有者
        StreamResult console = new StreamResult(System.out);
        StreamResult file = new StreamResult(myFile);

        //将 XML 源代码写入流结果
        transf.transform(source, console);
        transf.transform(source, file);
    }

    //使用createElement()在createUser()方法中创建一个新的用户元素。 元素的属性由setAttribute()设置
    private static Node createUser(Document doc, String id, String firstName,String lastName, String occupation) {

        Element user = doc.createElement("user");

        user.setAttribute("id", id);
        user.appendChild(createUserElement(doc, "firstname", firstName));
        user.appendChild(createUserElement(doc, "lastname", lastName));
        user.appendChild(createUserElement(doc, "occupation", occupation));

        return user;
    }

    //使用appendChild()将元素添加到其父级，并使用createTextNode()创建文本节点
    private static Node createUserElement(Document doc, String name,String value) {

        Element node = doc.createElement(name);
        node.appendChild(doc.createTextNode(value));

        return node;
    }
}
/*
 
生成user1.xml文件内容：
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users1 xmlns="XML与JSON.使用DOM">
  <user id="1">
    <firstname>Robert</firstname>
    <lastname>Brown</lastname>
    <occupation>programmer</occupation>
  </user>
  <user id="2">
    <firstname>Pamela</firstname>
    <lastname>Kyle</lastname>
    <occupation>writer</occupation>
  </user>
  <user id="3">
    <firstname>Peter</firstname>
    <lastname>Smith</lastname>
    <occupation>teacher</occupation>
  </user>
</users1>
*/